package com.csx.base.design.behavior.memento;

import java.util.ArrayList;
import java.util.List;

/**
 * @author cuisongxu
 * @date 2022/10/9 12:06
 */
public class Editor {

    private Doc doc;

    /**
     * 历史记录列表
     */
    private List<History> historyRecords;

    /**
     * 历史记录当前位置
     */
    private int historyPosition = -1;



    public Editor(Doc doc) {
        System.out.println("打开文档" + doc.getBody());
        // 载入文档
        this.doc = doc;
        // 初始化历史记录列表
        historyRecords = new ArrayList<>();
        // 载入文档后保存一份历史记录
        backup();
        // 显示内容
        show();
    }

    public void append(String text) {
        System.out.println("<<< 插入操作");
        doc.setBody(doc.getBody() + text);
        backup();
        show();
    }

    public void save() {
        // 模拟存盘操作
        System.out.println("<<< 存盘操作");
    }

    public void delete() {
        System.out.println("<<< 删除操作");
        doc.setBody("");
        // 删除后保存一份历史记录
        backup();
        show();
    }

    /**
     * 备份操作
     */
    private void backup() {
        historyRecords.add(doc.createHistory());
        historyPosition++;
    }

    private void show() {
        System.out.println(doc.getBody());
        System.out.println("文档结束>>>\n");
    }

    /**
     * 撤销操作
     */
    public void undo() {
        System.out.println(">>> 撤销操作");
        // 无法撤销
        if(historyPosition == 0) {
            return;
        }
        historyPosition--;
        // 恢复
        History history = historyRecords.get(historyPosition);
        doc.restoreHistory(history);
        show();
    }
}
